/**
 *
 * User: Zhikang.Peng
 * Date: 2018/06/08 17:26
 */
package base

import (
	"gitee.com/thghh/jvmgo/rtda"
	"gitee.com/thghh/jvmgo/rtda/heap"
)

/**
 调用方法,也设计是invokeFrame调用method
invokeFrame 调用方法的栈帧
method 被调用的方法
*/
func InvokeMethod(invokeFrame *rtda.Frame, method *heap.Method) {
	// 创建新的帧并推入Java虚拟机栈
	thread := invokeFrame.Thread()
	newFrame := thread.NewFrame(method)
	thread.PushFrame(newFrame)
	// 传递参数
	argsSlot := int(method.ArgSlotCount())
	if argsSlot > 0 {
		for i := argsSlot - 1; i >= 0; i-- {
			// 把参数从调用者的操作数栈中弹出
			slot := invokeFrame.OperandStack().PopSlot()
			// 放入被调用者的局部变量表中
			newFrame.LocalVars().SetSlot(uint(i), slot)
		}
	}
}
